package org.example.leetCode;


/**
 * 1047. 删除字符串中的所有相邻重复项
 * 给出由小写字母组成的字符串 s，重复项删除操作会选择两个相邻且相同的字母，并删除它们。
 * 在 s 上反复执行重复项删除操作，直到无法继续删除。
 * 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
 */
public class Code1047 {
    public String removeDuplicates(String s) {
        // 空字符串直接返回
        if (s == null || s.length() <= 1) {
            return s;
        }
        char[] str = new char[s.length()];
        int top = -1; // 使用-1表示空栈更符合常规做法

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            // 如果栈不为空且栈顶元素与当前字符相同，则删除栈顶元素
            if (top >= 0 && str[top] == ch) {
                top--;
            } else {
                // 否则将当前字符入栈
                str[++top] = ch;
            }
        }
        return new String(str, 0, top + 1);
    }

    public static void main(String[] args) {
        Code1047 solution = new Code1047();

        // 测试用例
        String[] testCases = {
                "abbaca",
                "azxxzy",
                "a",
                "aa",
                "abba",
                "abcde",
                "aaa",
                ""
        };

        System.out.println("测试删除字符串中的所有相邻重复项：");
        for (String testCase : testCases) {
            String result = solution.removeDuplicates(testCase);
            System.out.println("输入: \"" + testCase + "\" -> 输出: \"" + result + "\"");
        }
    }
}
